進入第 22 天,這天或許會感覺跟第 13 天:前端 Vue3 搭配後端 Laravel 9.x很相似...
確實!不過這天要練習的是 api,說白點!先前習慣用 routes/web.php 搭配 Blade 視圖看畫面,這裡主要是請前端用 api 呼叫,所以後端要建立的路由在 routes/api.php。
圖片來源:30天 JavaScript 提升計畫:從零到精通結合2024年的創新功能 - 第 11 天:API 與 Axios
就如同上圖要表達的一樣,前後端溝通就像在餐廳用餐(前端)請服務生點餐(API 請求)交送給廚師(後端)一樣,前後之間的溝通橋樑就是 API,所以進入主題吧!
定義 API 路由
在 routes/api.php 檔案中定義 API 路由,這裡使用 apiResource,laravel 會自動建立一個 RESTful 資源路由,包括 index, store, show, update, destroy 方法。
回顧:第 4 天:控制器的資源控制器(Resource Controllers)
use App\Http\Controllers\Api\PostController;
Route::apiResource('posts', PostController::class);
創建 API 控制器
指令 php artisan make:controller Api/PostController --api 生成控制器類,在 app/Http/Controllers/Api/PostController.php 中使用 API 方法:
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
    public function index()
    {
        return response()->json(Post::all());
    }
    public function store(Request $request)
    {
        $post = Post::create($request->all());
        return response()->json($post, 201);
    }
    public function show(Post $post)
    {
        return response()->json($post);
    }
    public function update(Request $request, Post $post)
    {
        $post->update($request->all());
        return response()->json($post);
    }
    public function destroy(Post $post)
    {
        $post->delete();
        return response()->json(null, 204);
    }
}
前端安排用 Vue3.4 搭配 Axios 進行 API 請求,處理 JSON 數據。
Axios
前後端要溝通的橋樑主要使用 Axios 套件,所以這裡要先安裝套件。
npm install axios
配置 Axios
在 resources/js/axios.js 中配置 Axios:
import axios from 'axios';
axios.defaults.baseURL = '/api';
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
export default axios;
Vue3.4
安裝流程與相同,可以參考,過程中有其他問題,歡迎提出一起討論解決!
回顧:第 13 天:前端 Vue3 搭配後端 Laravel 9.x的安裝 Vite (選擇自己的前端框架)
這裡主要建立一個元件 resources/js/components/PostList.vue
<template>
  <div>
    <h1>Posts</h1>
    <ul>
      <li v-for="post in posts" :key="post.id">{{ post.title }}</li>
    </ul>
    <button @click="fetchPosts">Load Posts</button>
  </div>
</template>
<script setup>
import { ref } from 'vue';
import axios from 'axios';
const posts = ref([]);
const fetchPosts = async () => {
  try {
    const response = await axios.get('/posts');
    posts.value = response.data;
  } catch (error) {
    console.error('Error fetching posts:', error);
  }
};
</script>
這部分主要測試 2 件事:
實現前後端交互
在 Laravel 中測試 API
使用 Postman 測試 API 路由:發送 GET 請求到 http://127.0.0.1:8000/api/posts,可以看到所有的貼文資料。
在 Vue 元件中呼叫 API
resources/views/welcome.blade.php 中新增 Vue 元件,這是前後端畫面的重點溝通橋樑:
<div id="app">
  <post-list></post-list>
</div>
<script src="{{ mix('js/app.js') }}"></script>
實現 CRUD 操作
建立、更新和刪除操作
在 PostController 中處理相應的請求方法,例如 store、update 和 destroy,然後在 Vue 元件中實作表單提交或按鈕點擊來呼叫這些 API 方法。
前端表單處理
<template>
  <div>
    <h2>Posts</h2>
    <ul>
      <li v-for="post in posts" :key="post.id">{{ post.title }}</li>
    </ul>
    <button @click="fetchPosts">Load Posts</button>
  </div>
  <hr>
  <div>
    <h2>Create Post</h2>
    <form @submit.prevent="createPost">
      <input v-model="newPost.title" placeholder="Post Title" />
      <textarea v-model="newPost.content" placeholder="Post Content"></textarea>
      <button type="submit">Create Post</button>
    </form>
  </div>
</template>
<script setup>
import { ref } from 'vue';
import axios from 'axios';
const posts = ref([]);
const newPost = ref({ title: '', content: '' });
const fetchPosts = async () => {
  try {
    const response = await axios.get('/posts');
    posts.value = response.data;
  } catch (error) {
    console.error('Error fetching posts:', error);
  }
};
const createPost = async () => {
  try {
    await axios.post('/posts', newPost.value);
    newPost.value = { title: '', content: '' };
    fetchPosts();
  } catch (error) {
    console.error('Error creating post:', error);
  }
};
</script>